<?php 
namespace mytp;

use mytp\Response;
class Captcha {
  
  protected $charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; // 随机因子
  
  // 一参为验证码字符个数, 二参表示随机因子, 返回值是生成的结果
  public function create($count = 5, $charset = null) {
    if(!$charset) {
      $charset = $this->charset;
    }
    $code = '';
    // 
    $len = strlen($charset) - 1;
    for($i = 0; $i < $count; $i++) {
      $code .= $charset[mt_rand(0, $len)];
    }
    return $code;
  }

  // 输出验证码图像
  public function show($code, $x = 157, $y = 40) {
    // 创建图像资源
    $im = imagecreate($x, $y);
    // 随机生成背景颜色
    imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
    // 设置验证码文本的颜色和字体
    $fontColor = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 180), mt_rand(0, 200));
    // echo $fontColor."<br>";
    // $fontFile必须是决定路径
    $fontFile = __DIR__.'./../font/simsunb.ttf';
    // echo $fontFile." -- Good <br>";
    // 在图像中绘制验证码
    for($i = 0, $len = strlen($code); $i < $len; $i++) {
      imagettftext(
        $im,                              // 图像尺寸
        mt_rand(16, 30),                  // 字符尺寸
        mt_rand(0, 20) - mt_rand(0, 25),  // 随机设置字符倾斜角度
        16 + $i * 20,                     // 字符间距
        mt_rand(30, 35),                  // 随机设置字符坐标
        $fontColor,                       // 字符颜色
        $fontFile,                        // 字符样式
        $code[$i]                         // 字符内容
      );
    }

    // 添加干扰线
    for ($i = 0; $i < 8; $i++) {
      // 随机生成干扰线颜色
      $lineColor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
      // 随机生成干扰线
      imageline($im, mt_rand(0, $x), 0, mt_rand(0, $x), $y, $lineColor);
    }

    // 添加250个噪点
    for($i = 0; $i < 250; $i++) {
      // 随机生成噪点位置
      // ???
      imagesetpixel($im, mt_rand(0, $x), mt_rand(0, $y), $fontColor);
    }
    return $this->output($im);
    // $this->output($im);
  }

  // 输出图像到网页
  protected function output($im) {
    ob_start();                     // 打开缓存区
    imagepng($im);                  // 生成图像
    imagedestroy($im);              // 销毁图像释放内存
    $data = ob_get_contents();      // 返回内部缓冲区的内容
    ob_end_clean();                 // 删除内部缓冲区的内容，并且关闭内部缓冲区
    return $data;
    // $header = ['Content-Type' => 'image/png'];
    // var_dump($data);
    // throw new HttpException(Response::create($data, 200, $header));
  }
}

?>